package 多线程案例;
//使用信号量模拟生产者消费者模型
//释放表示+1.申请表示-1
import java.util.concurrent.Semaphore;

public class Demo_11 {
    private static final int BUFFER_SIZE = 5;
    private static Semaphore full = new Semaphore(0); // 刚开始有没有元素可以消费，初始阻塞队列中没有一个元素
    private static Semaphore empty = new Semaphore(BUFFER_SIZE); // 空闲空间的大小，表示可以生成这么多的量

    public static void main(String[] args) {
        Thread producer = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(500);
                    //只有acquire带有阻塞功能
                    empty.acquire(); // 申请一个空闲空间
                    System.out.println("生产元素");
                    full.release(); // 释放一个元素（占据一个空闲空间）
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "生产者");

        Thread consumer = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                    full.acquire(); // 申请消费元素
                    System.out.println("消费元素");
                    empty.release(); // 释放一个空闲空间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "消费者");

        producer.start();
        consumer.start();
    }
}